PTA 打印沙漏(20分) 您所在的位置:网站首页 pta 设计 PTA 打印沙漏(20分)

PTA 打印沙漏(20分)

2023-10-07 08:55| 来源: 网络整理| 查看: 265

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

***** *** * *** *****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例: 19 * 输出样例: ***** *** * *** ***** 2

作者: 陈越

单位: 浙江大学

方法一:鉴于有人讨论,我写出了一个易懂的新版本

现在草稿本上,找规律,就像高中数列那样。 

于是,分为上半部分和下半部分的打印。

空格的规律就是从0开始不断加1,直到最中间行;

星星的规律是从行数开始不断减2,直到最中间行。这是观察出来的,行数为5行,第一行和最后一行的星星数都是5个。并且就算其他行数也是这样的。

#include int main(){ char c; int num; // num为星星总数, int row = 1; // row为总行数 scanf("%d %c", &num, &c); // 输入 num --; // 减掉最中间一行的1颗星 while(num >= 2*(row+2)){ // 2*(row+2)为每增加上下两行需要的星星数 num -= 2*(row+2); // 星星总数减去新增的上下两行的星星数 row += 2; // 行数+2 } int star_num = row; // 开始画图 for(int i = 1; i < row+1; i ++){ // 如果是上半部分 if(i = 2*(i+2)){ //num足够减去6、10、14等颗星时 num -= 2*(i+2); i += 2; } //开始画图 int row = i; int j; for(j = 1;j < row+1;j ++){ int n; for(n = 0;n < (row - i)/2;n++){ printf(" "); } int m; for(m = 1;m < i+1;m ++){ printf("%c",c); } printf("\n"); j>row/2 ? (i += 2):(i -= 2); } printf("%d",num); }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有